Skip to content

Version 7.0 Alpha Upgrade - #9613

Merged
lstein merged 3651 commits into
mainfrom
upstream-merge
Oct 2, 2026
Merged

lstein merged 3651 commits into
mainfrom
upstream-merge

Conversation

@joshistoast

@joshistoast joshistoast commented Oct 1, 2026 •

Copy link
Copy Markdown
Collaborator
v7

InvokeAI 7 Alpha

320+ PRs 2,600+ commits 5,600+ files alpha

Important

Heads up before you upgrade: v7 needs Python 3.12, the new UI is the default (the old one is still there with --web-legacy), and the database migrations only go one way. Invoke backs up your database first. Details are in Compatibility / Rollout.

Summary

Okay. This is InvokeAI 7.

It's been a lot of work. I could try to list everything that changed, but you'd be scrolling until next Tuesday. So instead, here are the three ideas that got this whole thing started.

🗂️ Projects, so you can wander off and come back

I wanted to be able to start something new without the nagging feeling I was about to lose the thing I was working on before. So now everything lives in a project: your canvas, your settings, your workflows, your queue history, and a board of its own for everything it makes.

Keep a few open as tabs. Close one and go do something else. Come back next week from the new Launchpad and it's right where you left it.

It autosaves! Edits go to your browser first and then sync to the server. That means losing wifi, a crashing tab, or the same project open in two windows won't mean the end for your recent work. If the client/server versions end up disagreeing, you'll get both. Workflows belong to their project now, with their own undo history, and you can export the whole project as an .invk file- and carry it over to another machine, or just for safe keeping.

⚡ One page shell

Previously, each set of curated features were divided effectively into separate pages with a load screen in between, but that's history. v7 is a single workbench built out of widgets: Generate, Canvas, Gallery, Preview, Workflows, Video, Upscale, Image Map, etc. Drag them where you like, flip between layout presets, pop one out into its own floating window, or just hit Mod+K and type what you want.

And we wanted it fast, and staying fast. Widgets don't load until you open them. Every page has a budget for how much it downloads and how many requests it makes, and CI will flatly refuse a PR that goes over. Nothing gets heavier unless someone decides it should. We're a little smug about this one, and when you try it I think you'll see why.

🎨 A canvas you can actually paint on

The old canvas was built on Konva, and it was great at what it was built for: inpainting. We wrote our own engine from scratch because we wanted real, unrestrained, fast image editing, with generation built right in.

So: layer groups (nest away), 16 blend modes, non-destructive adjustments, and a layers panel that still holds up at 2,000+ layers, and you can drive it entirely from the keyboard. There's a pressure-sensitive brush, marquee and lasso selections, gradients, shapes, a text tool that takes your own fonts, a magnifying color picker, and click-to-select objects. You also get a proper history panel you can scrub back through, PSD export for when your art needs to go meet Photoshop, and much more in the future to come.

Inpainting, regional guidance, control layers and staging are all still there, living in the same document as everything else.


Those three are why we started. Then, well... it kept going. There's new video generation models (MiniMax H3, LTX-2.5), a rebuilt gallery with semantic search and a zoomable Image Map of everything you've ever made, a modernized workflow editor with loops and batch generators, a reworked execution engine, a pile of new models and quantization formats, and hundreds of fixes. The rest is below. Go poke at it! 🎉

🔍 The rest of the tour

🎬 Video, now with sound

There's a whole Video panel now, with its own prompt, a built-in Video layout (Alt+3) and a Launchpad tile to get you there. It reshapes itself around whichever model you pick, and if Invoke is greyed out it tells you why.

  • Two new model families. MiniMax H3 makes video with audio. Its Ref2VA mode takes up to three video and nine image references (each gets a <Video 1>/<Picture 1> badge you can use in your prompt), and turbo LoRAs get it done in 4–8 steps. LTX-2.5 does stereo audio too, plus two-stage upscale-and-refine to 1536p, audio→video and video→audio, first/last-frame keyframes, interpolation and extend.
  • Wan 2.2 (T2V, I2V, TI2V-5B, Lightning) gets the same panel treatment.
  • Conditioning media that's actually nice to use. Trim clips with live-frame thumbnails, reorder references from the keyboard, preview a trimmed window right in Preview, or drop in audio on its own.
  • Your videos remember how they were made. Generation metadata is embedded in the MP4, so you can download a clip, upload it to a different install and still recall it. There's also a new external video recall API for remixing from scripts.
  • Uploads just work. .mov, HEVC and ProRes get converted to H.264 MP4 on the way in, and audio files become waveform videos. Gallery thumbnails skip fades and title cards to find a frame that's worth looking at.
  • Bundled workflows cover every LTX-2.5 mode and the MiniMax H3 recipes.
🖼️ A gallery that knows what's in it
  • Rebuilt from the ground up. It has reliable ordering and pagination, a starred strip above the grid, drag-to-board, live updates when media arrives from another tab or script, and an "In progress" section that follows your generations across boards.
  • Semantic search. Type what you're looking for ("red car at night") or drop in an image to find similar ones. Results re-rank as you type.
  • The Image Map. Every image and video you've made, laid out by similarity on a zoomable map. It finds clusters on its own and names them ("portraits", "foggy forests"…). Click anything to jump to it in the gallery, or select a whole cluster at once. It stays quick on galleries of 170k+ images.
  • A gallery picker on every image slot, plus "Find in Gallery" on any thumbnail so you can see where something came from.
  • Intermediates manager in Settings. It shows how much space each project's temporary files take up and cleans them out safely, without touching anything an open project still needs.
  • Touch support all over: hold to drag, swipe between images, pinch to zoom.
🧩 Workflows, with loops
  • The node editor reached parity with legacy. Fields keep what you type, collections can be edited inline, and outdated nodes offer "Update node" or "Update all".
  • A library you can browse. It's a card grid with thumbnails and model badges. Each workflow shows what it needs, and you can install all the missing models in one click.
  • Workflows live in your project. Open a library template and you get your own copy to mess with. The shared library only changes when you say Save to library.
  • For / ForReturn loops. Loop over a collection while carrying state between iterations, stop early, nest loops, and resume after a restart. They come with new Concat, Zip and Cartesian collection nodes.
  • Media fields take files directly. Drop, upload or pick from the gallery, and choose a frame for video inputs.
  • Call Saved Workflow, If and batch generators all got a round of fixes. You can also export a workflow as a PNG.
🧠 Models, quantization & GPUs

The headline models are MiniMax H3 and LTX-2.5, both new in v7. On top of that, a lot of work went into making the models you already have smaller, faster and less likely to fall over:

Format What it buys you
FP8 Compute (opt-in, Ada+) Runs fp8 checkpoints on the tensor cores
FP8 Storage Turned on at install for fp8 files, and scaled fp8 stays packed. FLUX.2 Klein 4B goes from 7.4 → 3.9 GB with identical output
int8_convrot One shared scheme for FLUX.1, FLUX.2 Klein, Z-Image, Krea 2, Ideogram 4, Qwen3 encoders, PiD, MiniMax H3 and LTX-2.5
nvfp4 / MXFP8 Comfy nvfp4 checkpoints stay packed, and MXFP8 files load
GGUF Qwen3-VL A quantized text encoder for Krea 2 and Ideogram 4
  • Smarter VRAM handling. Model loads no longer starve each other, freshly loaded models don't get evicted straight away, the budget counts memory the allocator can give back, and installing a pile of models no longer loads entire checkpoints into RAM.
  • Multi-GPU. Cancel stops mid-step and frees VRAM, and prompt tools and image indexing hop onto whichever GPU is idle.
  • ROCm. Moved to torch 2.13 + ROCm 7.2, with fixes for black images and long-clip crashes.
  • Tiled FLUX.1 VAE. Decoding stays around 1.2 GB however big the image is.
  • Works offline. Tokenizers and encoder configs ship with Invoke instead of being fetched from Hugging Face.
  • Engine internals. Each architecture now declares itself in one file, which the frontend reads, so the two can't drift apart. The execution engine was refactored so that loops, conditionals and nested workflows share one scheduler. The frontend contract hasn't changed.
✨ And a bunch more
  • Dynamic prompts, wildcards (with search and autocomplete) and prompt templates
  • A redesigned Generate panel, scrubbable number fields, and seed modes (random, fixed, increment, decrement)
  • An Upscale widget, now with FLUX.1
  • Paste media anywhere, an install queue panel, and a Diagnostics panel with JSON export
  • Translations, a high-contrast mode, searchable settings, feature hints, and a Catppuccin Mocha theme 🐱
  • Full tablet support

📈 By the numbers

320

pull requests

2,607

commits

5,684

files touched

+771k

lines added

88k

lines of new Python tests
%%{init: {"pie": {"textPosition": 0.75}} }%%
pie showData title Where the new lines went (thousands)
    "webv2 frontend" : 508
    "Tests" : 88
    "API, services & invocations" : 87
    "Inference & model management" : 29
    "Build, tooling & other" : 32
    "Docs" : 3
Loading
xychart-beta
    title "PRs merged per week"
    x-axis ["Jun 29", "Jul 6", "Jul 13", "Jul 20", "Jul 27", "Aug 3", "Aug 10", "Aug 17", "Aug 24", "Aug 31", "Sep 7", "Sep 14", "Sep 21", "Sep 28"]
    y-axis "PRs" 0 --> 60
    bar [5, 0, 4, 6, 8, 14, 21, 37, 36, 29, 40, 40, 56, 24]
Loading
timeline
    title Three months of v7
    June : v7 begins (#2)
         : Gallery progress and intermediates
    July : i18n, reference images
         : The new canvas lands (#9)
         : Upscale widget, command palette
         : State architecture rebuilt
         : Dynamic prompts and wildcards
    August : Launchpad home screen, .invk projects
           : Image Map and semantic search
           : Floating widget windows
           : MiniMax H3 video and the Video panel
           : Generate panel redesign
    September : Canvas overhaul with layers panel and editor panes
              : Execution engine refactor
              : fp8, nvfp4 and MXFP8 quantization
              : LTX-2.5 video with audio
              : Project-owned workflows, intermediates manager
              : webv2 becomes the default
Loading

Compatibility / Rollout

Warning

There's no downgrade path. Migrations are one-way, and older builds refuse a database that has migrations they don't know about. Invoke writes <db>_backup_<timestamp>.db before migrating; restore that file to go back.

Area What changes What to do
Python >=3.12,<3.13 (3.11 dropped) Upgrade Python. Remove any py3.11 required status checks
Default UI The new UI is served by default. --web-legacy serves the old UI, and --webv2 remains as an alias Nothing, unless you want the old UI
Package paths invokeai.frontend.web → invokeai.frontend.webv1. OpenAPI and typegen moved to invokeai/frontend/api Update anything that imports the old path
Database 21 new migrations: projects and boards, image index, fonts, wildcards, intermediates, queue receipts, workflow revisions… Each migration now runs inside its own transaction Automatic, after a backup
Migration 33 Upstream's migration_33 (image subfolder moves) moved to migration_34, and the fork's projects table took 33. Repair migrations cover databases that already ran upstream's 33 Nothing. Covered by the v6.14 upgrade test above
Config Only additions: db_synchronous, fp8_compute, image_index_*, fonts_*. force_tiled_decode now also applies to FLUX.1 Optional
Dependencies Adds umap-learn, scikit-learn and numba. The ROCm extra moves to torch 2.13 + ROCm 7.2 uv sync
API Nothing removed. New /projects, /image_map, /intermediates, /fonts, /wildcards, /recall/video and /api/v2/models/capabilities endpoints. Workflow records gain revision Regenerate API clients
Projects Document schema 3, canvas schema 3–4. The server answers 412 to clients too old to open a project Nothing
Node authors Built-in nodes moved into per-architecture packages, and the old import paths still work through forwarding shims Nothing yet. Move to the new paths when convenient

Merge strategy: please use a merge commit, not a squash, so the 2.6k commits keep their history and authorship.

gitGraph
    commit id: "v6.14"
    branch v7
    checkout v7
    commit id: "webv2 + canvas"
    checkout main
    commit id: "upstream work"
    checkout v7
    merge main id: "syncs ×13"
    commit id: "video, projects, Image Map"
    checkout main
    merge v7 id: "InvokeAI 7 🎉"
Loading

Checklist

  • The PR has a short but descriptive title, suitable for a changelog
  • Meaningful regression coverage added / updated where needed; obsolete tests/code removed
  • Persisted-state and API changes include required migrations / compatibility validation
  • Relevant performance/efficiency opportunities considered; material claims have evidence
  • Material review findings resolved and relevant checks rerun
  • Documentation added / updated (if applicable)
  • Updated What's New copy (if doing a release after this PR)

💜 Credits

Remarkably, v7 came from four people, 320 PRs and more late nights and all-nighters than we'll admit to.


@joshistoast

@lstein

@Pfannkuchensack

@JPPhoto

Huge thanks to everyone who tested early builds and told us what was broken.

JPPhoto and others added 30 commits September 28, 2026 02:00
Keep Call Saved Workflow roots eligible during child waits.
… counter

- The adapter-wide PDH counter cannot be used: measured with an 8 GiB holder, the holding process read 15.66 GiB and
  another read 0.176 GiB for the same instance at the same moment. It also shares the driver's basis, so subtracting
  torch's live figure invented ~2 GiB of foreign residency after every load/unload cycle
- The ceiling is min(total, max(budget, our CurrentUsage)): a budget below our own residency asks this process to
  trim itself, which the cache does for the reservation. A foreign holder that leaves the budget alone is documented
  as undetectable
- One PDH query per counter, per-item CStatus checked, usage clamped rather than dropped with the budget
- Interpolate decode peaks in bytes so a smaller image is never priced above a larger one
Moving items onto Uncategorized now uses the same drop path as named boards.
User-facing copy, counts and the layer save action now say Uploads.
Arrow-key navigation and scroll-to-session follow the new starred, in-progress, listing order.
Modified Enter/Space no longer stops at the tile or starts a keyboard drag.
Selected tiles, including in-progress ones, get a shared inset accent ring.
Unselected line-tab triggers use the ghost-button hover tint.
Invalid form controls and drop zones tint red on hover instead of repainting a neutral border.
Label and value stay legible over the fill.
The form draft lives in an external store read per section; generate values are exposed as a store with narrow selectors.
The rail becomes route links in visual order: Workspace, open projects, Manage; entries show a leave arrow on hover.
Set a thumbnail from the gallery or an upload, or remove it; the mock backend serves the thumbnail routes.
… add FLUX.1

The widget accepted only SD1.5 and SDXL, and its compiler threw without a tile
ControlNet, so an architecture without one could not reach it. A capability table
now says what each architecture has; the compiler builds the shared prefix once
and dispatches to a per-architecture builder that `satisfies` the same keys.

FLUX.1 gets a builder: both VAE ends tile, and the frame is fitted to the grid
`flux_denoise` accepts, because Spandrel rounds to 8 and the node demands 16.
Structure, the tile ControlNet picker and the negative prompt are hidden where
nothing consumes them; T5, CLIP and VAE are required where the loader needs them.
Update the reconnect viewport seed and cover a lone off-screen call-workflow node.
Folders are identified by their scaling/shift constants and single files by an explicit base, then the backbone their name or install source states; adds FLUX.1-diffusers and SD3 VAE configs, and an override now decides within a latent family instead of being overruled.
VAELoader loads SD3 single files in either layout, FLUX.1 folders outside float16, and flat VAE folders requested as SubModelType.VAE.
Reidentify passes the stored install source, so name evidence survives a re-probe.
Restore workflow editor viewport after preview
Resolve selected-branch iteration paths in If runtime handling and document direct output_collection consumers.
test: keep the nvfp4 loader forwards off torch's CPU bf16 GEMM
lstein and others added 19 commits October 1, 2026 14:09
docs: reorganize for v7 with prefix-ordered sidebar and new Users Guide pages
…-gaps

Moves the quantized formats to Model Formats and Families, model identification under Advanced Topics, and the Ideogram 4 and ERNIE-Image additions to their new per-family pages.
Points the Ideogram 4 requirements link at its page and sorts Upscaling after Intermediates.
fix(webv2): darken success and warning toast fills for AA contrast
…indows-memory

Carries the branch's low-VRAM docs and regenerated API contracts to their moved locations under configuration/Optimization and frontend/api.
Carries the branch's regenerated API contracts to their moved location under frontend/api.
docs: document model, quantization and upscale changes from recent PRs
fix(z-image): hold the schedule shift at the end of its fit
Keeps the corrected force_tiled_decode description next to auto_tiled_decode and regenerates the API contracts.
Folds the automatic-tiling docs into the existing Tiled VAE decode and encode section and fixes the moved page's system-requirements link.
…-2.13

Keeps the CUDA or Intel XPU requirement and drops the CUDA 12.x mention from the FP8 Storage page, and regenerates the API contracts.
ROCm on Windows: keep VRAM resident and bound attention and VAE memory
…-2.13

Regenerates the API contracts with both noise_dtype and the ROCm memory settings.
chore(deps): move the cpu and cuda extras to torch 2.13.0 (cu130)
@lstein
lstein merged commit 8f7bd21 into invoke-ai:main Oct 2, 2026
14 checks passed
@lstein
lstein deleted the upstream-merge branch October 2, 2026 00:42
joshistoast added a commit that referenced this pull request Oct 2, 2026
## Summary

Two community finetunes of Anima now install and generate correctly:
[Anima-2.9B](https://huggingface.co/Gazingstars123/Anima-2.9B) and
[Anima-3.8B](https://huggingface.co/lylogummy/Anima-3.8B).

**Anima-2.9B** (40 DiT blocks instead of 28) already installed as Anima,
but the loader built the transformer from a hard-coded 28-block config
and loaded with `strict=False`. It filled the first 28 blocks and
dropped the other 12 (240 tensors) as unexpected keys, logged at DEBUG
only. The result was a degraded image and no error. The loader now reads
the depth from the checkpoint and refuses gaps. The int8_tensorwise
build from the same repo loads too, through
`install_int8_convrot_layers`.

**Anima-3.8B v1.1** (52 blocks) bundles a "semantic connector" into its
checkpoint that reads a second text encoder, Qwen3.5 4B. The connector
is timestep-aware, so its context changes at every step. Until now the
checkpoint installed as Anima, loaded 28 blocks and dropped the
connector. Now:

- `AnimaVariantType` (`anima_qwen3`, `anima_qwen35`), detected from the
bundled `anima_v2_connector.*` keys
- new `ModelType.Qwen35Encoder` (`qwen3_5_encoder`): single-file config
and loader built on the `transformers` `qwen3_5` decoder layers, with
the tokenizer vendored from `Qwen/Qwen3.5-4B` @ `851bf6e` (Apache-2.0).
The encoder checkpoint is not a stock export: it ships layer 31 without
its MLP, and the encoder reproduces that exactly.
- a port of the connector
(`invokeai/backend/anima/semantic_connector.py`), whose module names
match the checkpoint
- **Prompt - Anima** encodes Qwen3.5 when its new optional input is
connected. **Denoise - Anima** recomputes the connector context at every
step, for the positive, the negative and every regional conditioning,
with a float32 sigma. The connector scales sigma by 1000 before
embedding it, and bf16 rounding would shift its high frequencies.
- webv2: a **Qwen3.5 Encoder** slot shown only for the `anima_qwen35`
variant, plus graph, regional guidance and recall wiring
- the earlier Anima-3.8B v1.0 transformer, which needs a separate
adapter file, is refused at install with an `InvalidMatchError` that
names v1.1

**LoRAs and ControlNet-LLLite adapters.** Both finetunes insert their
new blocks between the original ones, so an adapter trained on Anima
patched different blocks from the third one on. Measured from the
checkpoints:
- Anima-2.9B holds all 28 blocks of Anima base-v1.0 bit for bit, with
its 12 new blocks at 2, 5, 8, …, 36.
- Anima-3.8B holds the 40 blocks of 2.9B nearly unchanged (cosine
similarity ≥ 0.9997, 11 bit-identical), with 12 new blocks at 3, 7, …,
47.

`invokeai/backend/anima/block_layout.py` records the tables. A LoRA's
DiT keys and an LLLite adapter's bindings now move to the blocks of the
model they were trained on: Anima adapters on 2.9B and 3.8B, and 2.9B
adapters on 3.8B. The adapter's depth is read off the highest block it
addresses.

Also included:
- starter models for both finetunes (2.9B bf16 and int8, 3.8B v1.1) and
the Qwen3.5 encoder, with the non-commercial license noted
- the Anima user guide page
- three additions to `new-model-integration.mdx`, from the gaps this
change hit:
  - a new section, *Extending an existing architecture*
  - a section on persisted records and migrations
  - corrections to the webv2 checklists

<!-- Screenshots: the Components section with the Qwen3.5 Encoder slot
for Anima-3.8B, and sample outputs. -->

## Related Issues / Discussions

- Builds on #9613 (merged).
- #9506 (Anima prompt weighting) still targets the v6 path
`invokeai/app/invocations/anima_text_encoder.py`. In v7 the node lives
at `invokeai/app/invocations/text_encoder/anima_text_encoder.py`, and
this PR changes it as well: the new Qwen3.5 input, and the conditioning
fields it stores. #9506 needs a v7 port either way, and that port picks
up this file.
- Reference implementation:
[GumGum10/comfyui-anima-3-8B](https://github.com/GumGum10/comfyui-anima-3-8B)
(MIT).

## QA Instructions

**Automated**
- `uv run pytest -n 8 tests/backend/model_manager
tests/backend/architectures tests/backend/anima tests/backend/qwen3_5
tests/backend/util tests/backend/patches tests/app/invocations
tests/app/services/shared tests/app/services/model_records
tests/test_package_data.py`: 6254 passed, 1 failed. The failure,
`test_16_channel_vae_loader.py::test_an_ldm_layout_file_is_converted_and_loses_no_tensor`,
reads an LFS fixture that was not pulled in the test worktree; it is
unrelated.
- `ruff check .` and `ruff format --check .`: clean.
- webv2: `lint:tsc`, `lint:oxc`, `format:check` and `architecture:check`
pass. Vitest over `src/features/generation`, `src/workbench`,
`src/features/models` and `src/features/workflow`: 7277 passed, 2
failed. Both failures are in image-map (`clusterStats`, `indexProgress`)
and come from German-locale digit grouping on the test machine;
unrelated.
- Regenerated: `openapi.json`/`schema.ts`, the capabilities fixture, and
the graph-coverage snapshot. The docs build passes, and
`check-docs-data` shows no diff.

**After review**
- **Startup import:** the prompt node imports the Qwen3.5 encoder where
it runs, not at module level. That spares every app start transformers'
`qwen3_5` modeling module, about 0.25 s. A subprocess test fails on the
previous module-level import.
- **Migration on real databases:** the full chain ran on copies of three
populated databases, using `init_db` as the app does, and every model
record read back afterwards.
- A v7 dev root with Anima base, preview and a tcfp8 build: all three
became `anima_qwen3`.
  - A v7 dev root with Anima base fp8: it became `anima_qwen3`.
- The production database of a v6 install, 69 MiB with 75 models: the
chain ran in 0.3 s and all 75 records read back. It holds no Anima main
model.
- Two Ideogram-4 GGUF records from another branch's build were invalid
before and after; they are unrelated.
- **FP8 Storage and the connector's timestep path** (Anima-3.8B,
832×1216, 30 steps, three seeds; every run fully resident and
bit-reproducible):

  | | PSNR against bf16 |
  |---|---|
| timestep path kept in bf16 (the previous exception) | 8.4 / 10.3 / 9.6
dB |
  | everything in FP8 | 8.4 / 10.2 / 9.6 dB |
  | whole connector in bf16 | 8.3 / 10.1 / 9.6 dB |
  | Anima base, FP8 against bf16 | 15.9 / 15.2 / 14.0 dB |

The exception changed nothing measurable and cost 152 MiB (159M
parameters), so it is gone. FP8 Storage changes Anima-3.8B's composition
through its DiT blocks, not the connector; the user guide now says so.
- **LLLite through the block layout** (`anima-lllite-any-test-like-v2`,
trained on Anima). Control: a grayscale render. Prompt: different
content. The metric is the edge correlation between output and control:

| | no adapter | adapter by index (before) | adapter on the kept blocks
(now) |
  |---|---|---|---|
  | Anima base | 0.126 | 0.451 | 0.451 |
  | Anima-2.9B | 0.121 | 0.187 | 0.474 |
  | Anima-3.8B | 0.081 | 0.106 | 0.421 |

By index, the finetunes all but ignored the adapter; on the kept blocks
they follow it as Anima base does. The LoRA path shares the tables and
is unit-tested (key moves, untouched LLM adapter and text encoder keys,
cached LoRA not modified); no Anima LoRA was available locally for an
end-to-end run.

<!-- Screenshots: LLLite before/after sheet, FP8 Storage sheet for
Anima-3.8B. -->

**Numerical checks against the reference implementation, on the real
weights**
- Qwen3.5 encoder, fp32: relative L2 ~1.5e-6 at layers 7/15/23/31, for
27- and 114-token prompts. In bf16 the error is ~1e-2, the same as the
reference's own bf16 error.
- Connector: bit-identical (relative L2 0.0) at sigma 1.0, 0.75, 0.3 and
0.02. An empty prompt (one masked Qwen3.5 token) also matches the
reference, on both the math and the efficient SDPA backends.

**End to end**: RTX 4090, fresh root, models installed in place through
the API, 832×1216, 30 steps, Euler, seed 1234.

| Model | Result |
| --- | --- |
| Anima Base 1.0 | unchanged (regression check) |
| Anima-2.9B bf16 | coherent, all 40 blocks loaded |
| Anima-2.9B int8 | nearly identical to bf16; 640 of 640 layers kept
int8, 2.9 GB in VRAM instead of 5.6 GB |
| Anima-3.8B v1.1, CFG 6 | coherent, with clearly better spatial and
object binding |
| Anima-3.8B, empty negative prompt | coherent |
| Anima-3.8B without a Qwen3.5 encoder | refused by the model loader
with a message naming the missing encoder |

Speed, single runs only (not a benchmark): ~1.7 it/s for 2.9B against
~1.3 it/s for 3.8B, which also runs the connector every step.

**Browser** (built webv2 against the same server):
- The Qwen3.5 slot appears only when Anima-3.8B is selected. Invoke
stays disabled until both encoders are chosen.
- Generation works, and the image metadata records `qwen3_5_encoder`.
- **Reset all to model defaults** sets 40 steps / CFG 6, the settings of
the author's reference workflow.


## Review

Remaining risks and limitations:
- The block layout tables are keyed by depth (40, 52). These are the
only depth-expanded Anima models today. A future finetune with one of
these depths but another layout would need its own entry.
- An adapter's own depth is read off the highest block it addresses. An
adapter trained on Anima-2.9B that addresses only blocks below 28 would
be taken for an Anima adapter.
- On Anima-3.8B, the blocks an Anima adapter lands on were changed
slightly, and the semantic connector conditions every block. Adapters
work there (see the LLLite table), but results can differ more than on
2.9B.
- The reference masks every Qwen3.5 token from the first id 151643 on.
That id is the Qwen3 padding token, but in Qwen3.5's vocabulary it is
the ordinary token " 내용". This behavior is not reproduced; empty prompts
behave like the reference.
- The author's workflow samples with `res_multistep` and a beta
schedule, which Anima's scheduler set does not offer.
- The int8 path is new for Anima and has been validated on the
Anima-2.9B int8 file only.

## Compatibility / Rollout

- **Migration** `2026_10_01_add_anima_variant` (depends on
`2026_09_26_add_workflow_revision`): `variant` is now a required field
on Anima main records. Without the migration, every installed Anima
model would fail validation on read and vanish from the model list. The
migration reads each checkpoint's header, so a 3.8B installed on an
earlier v7 build becomes `anima_qwen35`. A record whose file cannot be
read gets `anima_qwen3`.
- **New persisted values**: model type `qwen3_5_encoder`, variants
`anima_qwen3`, `anima_qwen35` and `qwen3_5_4b`.
- **Node versions**: `anima_model_loader` 1.5.0 and `anima_text_encoder`
1.5.0. The new inputs and outputs are optional, so existing workflows
keep validating.
- **Packaging**: `invokeai.backend.qwen3_5` is added to `package-data`.
A new `tests/test_package_data.py` checks that every vendored
`*.json`/`*.json.gz` under `invokeai/backend` ships in the wheel.

## Checklist

- [x] _The PR has a short but descriptive title, suitable for a
changelog_
- [x] _Meaningful regression coverage added / updated where needed;
obsolete tests/code removed_
- [x] _Persisted-state and API changes include required migrations /
compatibility validation_
- [x] _Relevant performance/efficiency opportunities considered;
material claims have evidence_
- [x] _Material review findings resolved and relevant checks rerun_
- [x] _Documentation added / updated (if applicable)_
- [ ] _Updated `What's New` copy (if doing a release after this PR)_
joshistoast added a commit that referenced this pull request Oct 2, 2026
…te (#9644)

## Summary

This brings back the "What's New" notes from 6.14.2 and earlier in the
v7 (webv2) UI, redesigned around the v7 highlights, and makes the UI
show the real release version instead of a hard-coded `7.0`.

- **What's New dialog.** A larger dialog led by the v7 logo, the title
and a server-version badge. Headline features show as icon cards
(`whatsNew.highlights`: redesigned interface, projects, rebuilt Canvas,
expanded model support), with the remaining notes listed under "Also in
this release" (`whatsNew.items`). **Read the Docs** and **Read Release
Notes** (`releases/tag/v<server version>`) are footer buttons. The
`<StrongComponent>` emphasis from 6.14 is gone; card titles carry that
emphasis now.
- **Automatic first-run showing.** The dialog opens on its own once per
server version for each account. It waits until the account's workbench
preferences have loaded and the alpha notice has been dismissed, so the
two never stack. Dismissing it stores `whatsNewSeenVersion` in the
account's preferences.
- **Lightbulb button.** A lightbulb sits in the app menu footer, between
Settings and Documentation. It uses the same Phosphor
`LightbulbFilament` (bold) glyph as 6.14.2, vendored into
`VendoredIcon.tsx` because webv2 doesn't depend on react-icons.
- **Launchpad entry.** The launchpad has no app menu, so its sidebar
footer gets a "What's New in Invoke" action with the same lightbulb,
between Preferences and Help and resources.
- **Home in the Invoke menu.** The editor's Invoke menu gains a **Home**
item, with the launchpad's house icon, above the Manage group.
- **App version.** `APP_VERSION` was hard-coded to `'7.0'` and went
stale (the server is `7.0.0-rc1`). Vite now reads `__version__` from
`invokeai/version/invokeai_version.py`, the same file the release
workflow checks against the tag. The splash screen, app menu, Help menu,
`.invk` export manifest, and diagnostics and log exports all show the
real version. The release process still bumps only that one file.
- **Docs link.** The app-menu Documentation icon and the launchpad Help
→ Documentation entry now point to
https://invoke-ai.github.io/InvokeAI-7/.

### Implementation notes
- **Where the server version lives.** The server version is kept in
`whatsNewStore`, not in the TanStack query cache. The gate mounts above
the router, and account transitions call `queryClient.clear()` without
remounting it. A query-backed version therefore never arrived in the
real app, even though the unit tests passed. The version is loaded from
the authenticated route's `beforeLoad`, and opening the dialog from the
menu retries it.
- **Closing before the version loads.** A manual close sets a dismissed
flag for the rest of the page load. Without it, a version that arrived
late would reopen notes the user had just closed.
- **Initial focus.** Focus starts on the dialog panel. An automatic open
has no click behind it, so focusing the first link would have drawn a
keyboard focus ring on it.
- **Highlights catalog.** Each card's icon is paired with its
`whatsNew.highlights.<key>` entry in `WhatsNewDialog.tsx`, so adding a
headline feature means adding both. The browser test fails if a catalog
highlight has no card.
- **Build-time version.** The version is injected as
`import.meta.env.APP_VERSION`, not as a global `__APP_VERSION__` define:
Vitest browser mode re-encodes string globals, so they arrive wrapped in
an extra pair of quotes. The build fails if the version file is missing
or its `__version__` line can't be parsed; there is no fallback.
- **Startup bundle.** `appMetadata`, `whatsNewStore` and `useWhatsNew`
join `ROUTE_SHARED_MODULES`, so startup request counts stay at the
baseline. The build and browser baselines are re-recorded for those
three modules entering the startup graph (measured cost under QA
Instructions). The baseline's image-byte drop comes from main's assets
changing since the 2026-09-29 capture. The 113 KB logo loads only when
the dialog opens.
- **Translation-key test.** `translationKeys.test.ts` now treats an
array's own path as a key, because arrays are read whole with
`returnObjects`.
- **Test fixtures.** The mock backend seeds `whatsNewSeenVersion` so
journeys don't open on the dialog, and the topbar-menu accessibility
journey includes the new footer item in its keyboard order.

## Related Issues / Discussions

Follows #9613 (InvokeAI 7 alpha); the highlights are drawn from its
release notes.

## QA Instructions

- `pnpm lint` (format, oxlint, tsc, architecture): passes.
- `pnpm test`: 9290 passed.
- `pnpm test:browser`: all files pass, including `WhatsNewDialog` tests
for:
- automatic open, persisting the version on dismissal, and alpha-notice
gating;
  - every catalog highlight and note rendering;
  - manual open, which writes nothing;
  - a late version after a manual close;
  - a new account seeing the notes again;
  - initial focus.
- `pnpm test:accessibility`: all 17 journeys pass.
- `pnpm test:performance:build` (`check-architecture-performance.mjs`):
passes.
- `pnpm test:performance:browser`: passes after re-recording the browser
baseline for the three What's New boot modules. Startup scripts grow by
4.8 KB on the launchpad and 7.5 KB in the editor, and other assets by
1.2 KB (mostly the English catalog), with no new requests. The editor's
image bytes drop by 112 KB because the previous capture predates main's
asset changes. The 113 KB logo is not loaded at startup.
- App version: `APP_VERSION` is `7.0.0-rc1` in Node Vitest, browser
Vitest, `vite dev` and the production bundle. A build in the Docker
stage's directory layout succeeds, and fails with a clear error when the
version file is missing or malformed.
- Not run: the Docker image build itself.
- In a browser against the mock backend (dark and light themes; 1440×900
and 1280×720):
- the dialog opens automatically for an unseen version and has no focus
ring;
  - after dismissing it and reloading, it stays closed;
  - the menu button opens it;
  - Tab reaches the footer links and Esc closes it;
  - at 1280×720 the body scrolls under a fixed header and footer.

## Review

No material findings remain. Remaining limitations:
- **Tab with an outdated version.** A tab left open since before an
upgrade pushes its whole preference document whenever any setting
changes. That can roll `whatsNewSeenVersion` back, so the notes show
once more. Every preference already behaves this way.
- **Late version.** If the version request is slow, the notes can appear
on top of another dialog that is already open.
- **Settings-load fallback.** When the backend settings load fails and
local settings are used instead, the dialog can close and reopen on
navigation.
- **Dev builds.** The release-notes link points to a tag that doesn't
exist on development builds.
- **Anima models.** The "Expanded model support" card mentions larger
Anima models, which have not merged yet.

## Compatibility / Rollout

- **Docker.** The web-builder stage now mirrors the repository layout
(`/build/invokeai/frontend/webv2` plus
`/build/invokeai/version/invokeai_version.py`), and the final stage
copies `dist` from the new path.
- **Builds outside the repository.** A webv2 build without
`invokeai/version/invokeai_version.py` two directories up now fails. The
wheel script, CI workflows and Dockerfile all build inside the
repository layout.

## Checklist

- [x] _The PR has a short but descriptive title, suitable for a
changelog_
- [x] _Meaningful regression coverage added / updated where needed;
obsolete tests/code removed_
- [ ] _Persisted-state and API changes include required migrations /
compatibility validation_
- [x] _Relevant performance/efficiency opportunities considered;
material claims have evidence_
- [x] _Material review findings resolved and relevant checks rerun_
- [x] _Documentation added / updated (if applicable)_
- [x] _Updated `What's New` copy (if doing a release after this PR)_

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api backend PRs that change backend files CI-CD Continuous integration / Continuous delivery docker docs PRs that change docs frontend PRs that change frontend files frontend-deps PRs that change frontend dependencies invocations PRs that change invocations python PRs that change python files Root services PRs that change app services

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants